package com.xbongbong.pay.platform.wechatpay.pojo.request.h5;

import com.alibaba.fastjson.annotation.JSONField;
import com.xbongbong.pay.platform.wechatpay.pojo.request.WeChatBaseRequest;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;

/**
 * 申请退款请求
 * @author 魏荣杰
 * @date 2021/1/7 16:25
 * @since
 * @version
 */
@Setter
@Getter
public class WeChatH5ApplyRefundRequest extends WeChatBaseRequest {
    private static final long serialVersionUID = -5107518621545752857L;

    /**
     * 商户申请的公众号/小程序或者移动应用对应的APPID
     * 示例值：wx8888888888888888
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "appid")
    private String appId;

    /**
     * 微信支付分配的商户号
     * 示例值：1900000109
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "mch_id")
    private String mchId;
    /**
     * 微信分配的子商户应用ID，如需在支付完成后获取sub_openid则此参数必传。
     * 注意：仅适用于服务商模式
     * 示例值：wx8888888888888888
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_appid")
    private String subAppId;
    /**
     * 微信支付分配的子商户号
     * 注意：仅适用于服务商模式
     * 示例值：1900000109
     */
    @NotBlank
    @Size(min = 1, max = 32)
    @JSONField(name = "sub_mch_id")
    private String subMchId;
    /**
     * 随机字符串，不长于32位。推荐随机数生成算法
     * 示例值：5K8264ILTKCH16CQ2502SI8ZNMTM67VS
     */
    @NotBlank
    @Size(min = 1, max = 32)
    private String nonceStr;
    /**
     * 签名，详见签名生成算法
     * 示例值：C380BEC2BFD727A4B6845133519F3AD6
     */
    @NotBlank
    @Size(min = 1, max = 64)
    private String sign;
    /**
     * 签名类型，目前支持HMAC-SHA256和MD5，默认为MD5
     * 示例值：HMAC-SHA256
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "sign_type")
    private String signType;
    /**
     * 微信的订单号，优先使用
     * 示例值：1217752501201407033233368018
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "transaction_id")
    private String transactionId;
    /**
     * 商户系统内部订单号，要求32个字符内，只能是数字、大小写字母_-|*@ ，且在同一个商户号下唯一。
     * 示例值：1217752501201407033233368018
     */
    @Size(min = 1, max = 32)
    @JSONField(name = "out_trade_no")
    private String outTradeNo;

    /**
     * 商户系统内部的退款单号，商户系统内部唯一，只能是数字、大小写字母_-|*@ ，同一退款单号多次请求只退一笔。
     * 示例值：1217752501201407033233368018
     */
    @NotBlank
    @Size(min = 1, max = 64)
    @JSONField(name = "out_refund_no")
    private String outRefundNo;
    /**
     * 订单总金额，单位为分，只能为整数，详见交易金额
     * 示例值：100
     */
    @NonNull
    @JSONField(name = "total_fee")
    private Integer totalFee;
    /**
     * 退款总金额，单位为分，只能为整数，可部分退款。详见交易金额
     * 示例值：100
     */
    @NonNull
    @JSONField(name = "refund_fee")
    private Integer refundFee;
    /**
     * 退款货币类型，需与支付一致，或者不填。符合ISO 4217标准的三位字母代码，默认人民币：CNY，其他值列表详见货币类型
     * 示例值：CNY
     */
    @NotBlank
    @Size(min = 1, max = 8)
    @JSONField(name = "refund_fee_type")
    private String refundFeeType;

    /**
     * 若商户传入，会在下发给用户的退款消息中体现退款原因
     * 注意：若订单退款金额≤1元，且属于部分退款，则不会在退款消息中体现退款原因
     * 示例值：商品已售完
     */
    @Size(min = 1, max = 80)
    @JSONField(name = "refund_desc")
    private String refundDesc;
    /**
     * 仅针对老资金流商户使用
     * REFUND_SOURCE_UNSETTLED_FUNDS：未结算资金退款（默认使用未结算资金退款）
     * REFUND_SOURCE_RECHARGE_FUNDS：可用余额退款
     * 示例值：REFUND_SOURCE_RECHARGE_FUNDS
     */
    @Size(min = 1, max = 30)
    @JSONField(name = "refund_account")
    private String refundAccount;
    /**
     * 异步接收微信支付退款结果通知的回调地址，通知URL必须为外网可访问的url，不允许带参数
     * 如果参数中传了notify_url，则商户平台上配置的回调地址将不会生效。
     * 示例值：https://weixin.qq.com/notify/
     */
    @Size(min = 1, max = 256)
    @JSONField(name = "notify_url")
    private String notifyUrl;
}
